#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author:zhengxin
@file: 05_linear_algebra.py
@time: 2022/10/11  15:18
# @describe: 4.5 线性代数
"""
import numpy as np

x = np.array([[1., 2., 3.], [4., 5., 6.]])
y = np.array([[6., 23.], [-1, 7], [8, 9]])
print(x)
print(y)
print(x.dot(y))


# x.dot(y)等价于np.dot(x, y)：
print(np.dot(x, y))

# 一个二维数组跟一个大小合适的一维数组的矩阵点积运算之后将会得到一个一维数组：
print(np.dot(x, np.ones(3)))

# @符（类似Python 3.5）也可以用作中缀运算符，进行矩阵乘法：

print(x @ np.ones(3))


# numpy.linalg中有一组标准的矩阵分解运算以及诸如求逆和行列式之类的东西。它们跟MATLAB和R等语言所使用的是相同的行业标准线性代数库，
# 如BLAS、LAPACK、Intel MKL（Math Kernel Library，可能有，取决于你的NumPy版本）等：
from numpy.linalg import inv, qr

X = np.random.randn(5, 5)
# 表达式 X.T.dot(X)计算X和它的转置X.T的点积。
mat = X.T.dot(X)
print(inv(mat))
print(mat.dot(inv(mat)))

q, r = qr(mat)
print(r)